/*
    单例类：
        成员：
            1、单例对象
            2、互斥锁
            3、热点判断时间
            4、服务器监听端口
            5、URL下载前缀路径
            6、压缩包后缀名
            7、文件备份路径
            8、压缩包存放路径
            9、服务器ip地址
            10、备份信息文件
        接口：
            1、获取热点时间
            2、获取服务器端口
            3、获取服务器ip
            4、获取URL下载前缀路径
            5、获取压缩包后缀名
            6、获取文件路径
            7、获取压缩包路径
            8、获取备份信息文件路径
            9、单例类构造函数
*/


#ifndef __M_CONFIG_H__
#define __M_CONFIG_H__

#include "util.hpp"
#include <mutex>
using namespace std;

namespace cloud
{
    #define CONFIG_FILE "cloud.conf"

    class Config{
    public:
        static Config* getInstance(){
            if(_instance == nullptr){
                unique_lock<mutex> lock(_mtx);
                // _mtx.lock();
                if (_instance == nullptr){
                    _instance = new Config();
                }
                // _mtx.unlock();
            }
            return _instance;
        }

        int getHotTime(){
            return _hot_time;
        }

        int getServerPort(){
            return _server_port;
        }

        string getServerIP(){
            return _server_ip;
        }

        string getDownloadPrefix(){
            return _download_prefix;
        }

        string getPackfileSuffix(){
            return _packfile_suffix;
        }

        string getPackDir(){
            return _pack_dir;
        }

        string getBackupDir(){
            return _backup_dir;
        }

        string getBackupFile(){
            return _backup_file;
        }

        bool loadConfigFile(){
            //用./cloud.conf实例化文件工具对象，通过文件工具对象对./cloud.conf进行操作
            FileUtil fu(CONFIG_FILE);
            string body;
            if(fu.getContent(&body) == false){
                cerr << "load config file failed!" << endl;
                return false;
            }

            //用json对获取到的数据进行解析
            Json::Value root;
            if(JsonUtil::unserialize(body,&root) == false){
                cerr << "parse config file failed!" << endl;
                return false;
            }

            //将数据赋给成员变量
            _hot_time = root["hot_time"].asInt();
            _server_port = root["server_port"].asInt();
            _server_ip = root["server_ip"].asString();
            _download_prefix = root["download_prefix"].asString();
            _packfile_suffix = root["packfile_suffix"].asString();
            _pack_dir = root["pack_dir"].asString();
            _backup_dir = root["backup_dir"].asString();
            _backup_file = root["backup_file"].asString();

            return true;
        }

    private:
        Config(){
            loadConfigFile();
        }

    private:
        static Config *_instance;
        static mutex _mtx;
        int _hot_time;              //热点时间
        int _server_port;           //服务器端口
        string _server_ip;          //服务器ip
        string _download_prefix;    //下载url前缀
        string _packfile_suffix;    //压缩包后缀
        string _pack_dir;           //压缩包存放目录
        string _backup_dir;         //未被压缩的备份文件目录
        string _backup_file;        //备份信息
    };

    Config *Config::_instance = nullptr;
    mutex Config::_mtx;
}

#endif